package client.coordinador;

import static client.common.angular.Angular.angular;
import static client.common.libs.Underscore._;
import static org.stjs.javascript.JSCollections.$array;
import static org.stjs.javascript.JSCollections.$map;

import org.stjs.javascript.Array;
import org.stjs.javascript.Map;

import client.common.EndPoints.CoordinadorEP;
import client.common.Models.Curso;
import client.common.Models.Estudiante;
import client.common.Models.Materia;
import client.common.Models.MateriaCurso;
import client.common.Models.Profesor;
import client.common.angular.EmptyPromise;
import client.common.angular.NgScope;
import client.common.directives.EPChanging;
import client.common.directives.EPLoading;
import client.common.javascript.JsConsole;
import client.common.javascript.JsProcedure0;
import client.common.javascript.JsProcedure1;

public class AdminCursoScope extends NgScope {

	private Curso curso;
	private Map<String, Materia> materiasMap;
	@SuppressWarnings("unused")
	private Array<Profesor> profesores;
	@SuppressWarnings("unused")
	private Array<MateriaCurso> materiasCurso;
	private EPChanging epChanging;
	private EPLoading epLoading;
	private CoordinadorEP Coordinador;
	protected Array<Estudiante> estudiantes;

	public AdminCursoScope(final Map<String, Long> $stateParams,
			final CoordinadorEP Coordinador, EPLoading epLoading,
			EPChanging epChanging) {
		super("AdminCursoScope");
		this.epChanging = epChanging;
		this.epLoading = epLoading;
		this.Coordinador = Coordinador;

		this.materiasMap = $map();
		final AdminCursoScope that = this;
		this.curso = Coordinador.getCurso($stateParams.$get("idCurso"),
				new JsProcedure1<Curso>() {

					@Override
					public void $invoke(Curso p) {
						that.estudiantes = Coordinador
								.getEstudiantesCurso(p.id);
						Coordinador
								.getMaterias(new JsProcedure1<Array<Materia>>() {

									@Override
									public void $invoke(Array<Materia> materias) {
										that.materiasMap = _.indexBy(materias,
												"id");
										that.materiasCurso = Coordinador.getMateriasCurso(
												$stateParams.$get("idCurso"),
												new JsProcedure1<Array<MateriaCurso>>() {
													public void $invoke(
															Array<MateriaCurso> materiasCurso) {
														for (int i = 0; i < materiasCurso
																.$length(); i++) {
															MateriaCurso materiaCurso = materiasCurso
																	.$get(i);
															materiaCurso.materia = that.materiasMap
																	.$get(materiaCurso.idMateria
																			+ "");
														}
													}
												});

									}
								});

					}
				});

		this.profesores = Coordinador.getProfesores();

	}

	public void cambiarNombre() {
		final AdminCursoScope that = this;
		epChanging.$invoke(this, 1300, new JsProcedure0() {

			@Override
			public void $invoke() {
				that.epLoading.$invoke(that.Coordinador.updateCurso(
						that.curso.id, that.curso,
						new JsProcedure1<EmptyPromise>() {
							public void $invoke(EmptyPromise p) {
							}
						}), "#divNombreCurso");
			}
		});

	}

	public void asignarProfesor(final Profesor profesor,
			final MateriaCurso materiaCurso) {

		MateriaCurso mc = angular.copy(materiaCurso);
		mc.$delete("materia");
		mc.$delete("profesor");

		mc.profesor = profesor;
		JsConsole.console.log(mc);
		epLoading.$invoke(Coordinador.updateMateriaCurso(mc,
				new JsProcedure1<EmptyPromise>() {
					public void $invoke(EmptyPromise promise) {
						materiaCurso.profesor = profesor;
					}
				}), "#li-" + mc.idMateria);
	}

	public static Array<String> $inject() {
		return $array("$stateParams", "Coordinador", "epLoading", "epChanging");
	}

}
